入门教学案例
101 烟雾制作流程简介
这里我们从最简单的一个烟雾效果制作开始,展示 Catalyst FX 的基本操作流程
创建发射器

- 创建一个 Catalyst Source 发射器节点,该节点提供了一系列基于基本几何形状的发射器(Box,Sphere,等),可以往流场中添加温度,密度,速度,燃料等属性供解算器计算使用。
- 在 Initialize 下拉菜单中,选则 Source Smoke 配置,节点会自动设置好用于产生烟雾的发射器参数,这里一个最简单的烟雾效果制作,发射器需要发射:Velocity 速度,Density 密度,Temperature 温度这3个属性。
- 设置发射器大小为:(1.0,0.5,1.0)类似于一个被压扁的 Box,设置发射器发射的速度,密度,和温度的强度(Scale)均为5。
设置解算器参数

如图(上):在Catalyst Source 发射器节点下创建 Catalyst Solver 解算器节点,并在Solver节点处于高亮(金色边框)框选状态下,将鼠标放在 viewport 中按下键盘回车,显示出流体解算框大小编辑控制器,设置解算范围至合适大小。
在解算器节点上 Wind 面板中,设置风力方向(WindDirection)为:(0.5,0.0,0.0),即往X轴的方向添加速度为 0.5米/秒的微风。
最后,在Simulation面板中设置 Substep(子步)为2,提高计算品质,在Houdini时间轴左侧按钮区域单击 Play(播放)按钮,得到了我们最终如图显示的烟雾效果,这样就完成了一个最基本的烟雾模拟效果制作的流程。
通过该案例,我们对流体效果的制作流程进行了一个最简单的制作过程展示,即:创建发射器作为流体解算器的Input输入,设置流体容器计算区域大小,点击播放按钮进行计算。发射器会往流体容器中添加我们在发射器参数面板上设置好的属性信息,并计算出流体运动的形态。

当在Viewport中看见计算结果之后,我们在此时使用鼠标中间观察节点信息(Info)面板,可以看到解算节点的最终输出的Geometry 信息里,包含了 2个 Volume 数据(在流体解算中,更准确的叫法被称为 场 Field),这两个 Volume 在信息面板下册可以看到分别是 density (密度场)和 temperature (温度场)
所以,流体解算整个过程的最终输出,就是一组计算好的体积数据, 这里由于当 前案例是一个最简单的烟雾效果制作,所以解算器的最终输出只有 density 和 temperature 2个场(Field),而一个复杂效果的制作任务,可能会输出多个场的数据,接下来,我们对这些流体解算器可能输出的场,进行一个比较全面和系统的介绍。
102 场 Field
场是流体模拟中的基本概念,它记录了空间中每一个位置点上各种物理属性的数值,也是流体解算器的最终输出结果。和二维的图像一样,场可以理解为一种三维图像,是N张二维图像沿着Z轴叠加在一起的结果。所以场也有分辨率的概念,只是场的分辨率信息,需要3个参数进行描述。拿空间中每一点上的温度来举例:在一个1立方米的空间范围内,每隔1厘米(VoxelSize)就记录一下当前位置的温度高低,最终整个一立方米的空间范围内就有 100 * 100 * 100 个,也就是100万个温度记录点,而这 100 * 100 * 100 的描述就是3D场空间分辨率的描述,也可以描述为:100万个Voxels(体素)
场在GPU内的数据结构,通常是一个3D的Texture,这里,对日常效果制作会使用到的场进行一个信息汇总。
| 名称 | 中文 | 说明 or 渲染 |
|---|---|---|
| density | 密度场 | 代表了空气中可见气体的浓度信息。 渲染: Catalyst FX 中代表了烟雾的浓度 通常使用 RayMarching 进行绘制。 |
| temperature | 温度场 | 记录了空间中每一个位置的温度高低,温度的大小会直接影响流体所受到的浮力大小,温度越高的气体则越容易获得较大的浮力。 渲染: 自然界中,只要有温度的物体都会“发光”,在日常生活中,大多数物体由于温度较低,都不足以产生可见光,只能产生能量密度较低的红外波段光源,这种光源不可以通过肉眼直接观察到,但可以被专业仪器检测到。所有物体因其温度而发出电磁辐射,这个现象称为黑体辐射(Block Body)。 随着温度的进一步提升,物体发出的光的颜色也会随之改变,比如从红色变为黄色,最终到蓝色。这是因为,物体温度的增加导致其发出的电磁辐射的峰值波长向更短的波长移动,即从红外线区域向可见光乃至紫外线区域移动。这个现象可以通过普朗克黑体辐射定律来描述。所以,我们对温度高到足够产生可见光的物体进行绘制的时候,可以使用黑体辐射模型或普朗克黑体辐射模型来进行绘制,此时候温度场的信息就派上了用场。 |
| heat | 热量场 (有时也叫 flame 火焰 场) | 这里比较接近物理学的描述是,heat或flame场,是燃料在燃烧后产生的一个等离子态的区域,即火苗的强弱信息。它和温度场的区别在于:温度场通常覆盖了整个流体区域,不论是在火焰燃烧的等离子态区,还是烟雾流动的气态区,都存在温度,只是燃烧区域的温度会远远大于烟雾的温度。 |
| vel | 速度场 | 速度场存储了 流体解算器最终计算好的速度信息,它描述了流场区域内每一个点上速度的大小和方向信息,这是一个包含了3个分量场的数据,即:速度场数据通过3张 3DTexture 对象进行存储(vel.x,vel.y,vel.z)。 渲染: 速度场通常在流体渲染绘制运动模糊 (motion blur) 的时候,需要参与渲染的计算。 |
| fuel | 燃料场 | 燃料场作为燃烧计算的Input,模拟燃烧反应需要首先在燃烧的位置设置燃料信息,这里是指给 fuel 燃料场进行赋值操作,数值越大,代表该区域的燃料密度越高,燃烧反应越剧烈。 渲染: 如果我们在渲染的时候,也对燃料场进行绘制,就可以看到在燃烧反应的过程中,燃料一点点被消耗殆尽,并产生出火焰的过程 |
103 Smoke Control
在101案例展示了最基本的烟雾制作流程,并对各个场的基本原理了解了之后,我们来进一步细化 101 案例中的烟雾效果,给它的动态增加一点点细节
湍流
湍流是一种流体力学现象,它是流体运动中的一种混乱,不规则的运动形式。在制作流体解算动画时,通过往流体的计算过程中注入湍流控制,可以使我们的最终解算结果得到更多的模拟细节。

如图(上):在先前的101 Simple Smoke Example 案例中(最左),烟雾没有添加任何湍流效果控制,可以发现烟雾的动态效果十分单调,缺乏细节。我们分别在 101 案例的基础上,开启不同类型的湍流控制,可以看到烟雾产生了不同的细节变化,这里演示了在 Catalyst FX 中,分别开启3种常用的湍流作用后的效果对比,分别是:Vorticity Confinement,DisTurblance 和 CurNoise。这3种湍流效果都有自己的优缺点,我将通过后续的章节依次分别展开讲解。
局部控制 & Visualization

如图(上):我们观察101 Simple Smoke 案例可以发现,烟雾在形成的初期没有任何细节,但在经过一段时间发展和不断翻滚后,可以渐渐的生成出很多细节(尾部烟雾较淡的区域),所以我们此刻希望拖尾部分的形态保持现有效果,仅对刚刚发射出来的烟雾(红色框内)添加 CurlNoise 效果进行一个打乱处理,这个时候,我们就需要对流体进行分区湍流控制。
在Catalyst FX 中有多种方法提取提取流体的局部区域,来进行局部效果控制,这里我们先介绍一种最直接的概念:阈值(Threshold),阈值的概念很好理解,指的是当场内的某一个数值超过设置的 阈值 的时候,才开始起作用,拿这里我们即将添加的CurlNoise效果来举例,CurlNoise 默认情况下仅在有温度的区域起作用(流体内部),当温度小于一个 阈值的时候,就不 再产生作用效果,默认情况下,CurlNoise 不会在温度数值小于 0.15 的区域起作用(由 Clamp Below参数控制),所以接下来我们需要借助到 Visualization 功能,帮助我们更定量化的观察流体内部的运动状态。

如图(上):在Catalyst Solver 节点的 Visualization 参数面板中,找到 Temperature 子面板,勾选开启 Active 开关激活 Temperature 温度场可视化,调整 Offset 数值为1,将Visualization 切片移动到流体容器框外部。这里可以看到可视化切片呈现出冷暖渐变过度效果,这种冷暖渐变过度效果的展示,被称为:False Color,False Color的灵感来自于光谱,为了方便理解,我们这里可以简单的理解为:颜色越偏暖色的区域数值越大,颜色越偏冷色的区域,数值越小。

如图(上):Visualization Range 可视化范围,设置了当前场从冷色到暖色的区域范围,这里设置的数值是 0 ~ 1,在此处的含义是:温度场数值从 0 ~ 1 映射到 False Color 紫 ~ 红(冷色 ~ 暖色)的渐变过度显示。可以发现在烟雾发射的初期,烟雾内部温度较高呈现出纯红色的 FalseColor 可视化,随着烟雾在空中飘散,烟雾尾区域的温度逐渐降低呈现出蓝色到深蓝色的FalseColor可视化结果,如果这个时候我们希望查看哪些区域的温度强度小于0.5,可以将Visualization Range 设置成 0.5 ~ 1 (画右)。可以发现此时的可视化功能不再对温度数值强度小于 0.5 的区域进行可视化处理,出现FalseColor可视化的区域,温度场的数值均在 0.5 以上。

如图(上) 设置 Temperature 温度场可视化 Visualization Range 的数值为 4 ~ 10 ,可以发现基本上随着烟雾的飘散,温度场的数值会很快降到 4 以下,烟雾仅会在刚被发射的初期,存在高温区域,刚好和我们需要增加湍流细节的区域匹配,所以这里我们可以跟进温度场的强度,来进行 CurlNoise 添加区域的选则。

如图(上) 在Catalyst Solver 的 Turbulence 面板下勾选 CurlNoise 选项,在当前烟雾动态的基础上添加 CurlNoise 湍流,这里我们先设置 CurlNoise 的强度为3,然后设置 Clamp Below 数值为4,也就是温度小于4的时候不添加 CulNoise 效果。并开启当前面板下 Visualization 参数组的 Active Visualization 勾选,解算器会将当前CurlNoise的计算结果在 Viewport 中进行绘制,帮助我们观察 CurlNoise 的实际作用效果和范围。这里适当的降低烟雾显示浓度可以发现,CurlNoise 的作用范围仅发生在了烟雾刚产生时的内部高温区域(温度大于4的区域),拖尾处的烟雾是没有受到 CurlNoise的影响的,和我们的预期一致。

如图(上) 这里对比了当前案例开启 局部 CurlNoise 控制和关闭局部 CurlNoise 控制在前50帧的效果区别。通过仅在发射器刚产生烟雾的高温区域添加 CurlNoise 湍流控制,“破开”了烟雾在刚生成状态下过于规则和僵硬的感觉。
分层控制
和创作一幅画面的思路一样,